<?php
/**
 * Service_Essence
 *
 * Класс Service_Essence осуществляет работу с типами сущностей (ID, имя)
 *
 * @author Дмитий Кузьма <kouzma.d@gmail.com>
 * @author Гринько Виталий <perlaws@gmail.com>*
 * @version 2.0
 */
class Service_Essence extends ActiveRecord {

	public $tableName = 'essence_type';
	public $pkName = 'ID_essence_type';
	public $users = null;

  public function __construct($arrInitialFields = null) {
    Service_Debug::setDebug();
		parent::__construct($arrInitialFields);
		$this->users = new HasMany(array('className' => 'User_User', 'throw' => 'administration'));
  }

  /**
   * Определяет существует ли тип сущности 
   * 
   * @param string $essenceType - тип сущности
   */
  public static function isEssenceTypeCorrect($essenceType) {
  	switch ($essenceType) {
      case 'our_hotel_photo':
      case 'our_room_photo':
      	return true;
      default: return false;
  	}
  }
  
  /**
   * Получение имени сущности по идентификатору
   *
   * @param int $essenceNumber
   * @return string
   */
  public static function getEssenceTypeName($essenceType) {
    if (is_numeric($essenceType)) return self::getEssenceTypeNameById($essenceType);
    elseif (!is_string($essenceType)) throw new Exception('Invalid input numeric / string value type entity');
    if (self::isEssenceTypeNameCorrect($essenceType)) return $essenceType;
    else return false;
  }

  /**
   * Метод получает объект нужного типа. Объект будет сразу наполнен информацией, если передать id. Если этого делать не нужно, передайте null
   *
   * @param mixed $essenceType
   * @param integer $id
   * @return object
   */
  public static function getObjByID($essenceType, $essenceId = null) {
    $essenceType = self::getEssenceTypeID($essenceType);
    switch ($essenceType) {
  		case 2: case 'user': return new User_User($essenceId);
  		case 3: case 'faq': return new Faq($essenceId);
  		case 4: case 'faq_section': return new FaqSection($essenceId);
  		case 5: case 'article': return new Article($essenceId);
  		case 6: case 'hotel': return new Hotel($essenceId);
  		case 7: case 'city': return new City($essenceId);
  		case 8: case 'country': return new Country($essenceId);
  		case 9: case 'region': return new Region($essenceId);
  		case 10: case 'district': return new District($essenceId);
  		case 11: case 'room': return new Room($essenceId);
  		case 12: case 'booking': return new Booking($essenceId);
  		case 13: case 'our_hotel_photo': return new OurHotelPhoto($essenceId);
  		case 14: case 'our_room_photo': return new OurRoomPhoto($essenceId);
    }
  }

  /**
   * Метод получает View объект нужного типа.
   *
   * @param mixed $essenceType
   * @return unknown
   */
  public static function getViewObjByID($essenceType, $essenceId = null) {
    $essenceType = self::getEssenceTypeID($essenceType);
    switch ($essenceType) {
  		case 2: case 'user': return new View_User($essenceId);
  		case 3: case 'faq': return new View_Faq($essenceId);
  		//case 4: case 'faq_section': return new View_FaqSection($essenceId);
  		case 5: case 'article': return new View_Article($essenceId);
  		case 6: case 'hotel': return new View_Hotel($essenceId);
  		case 7: case 'city': return new View_City($essenceId);
  		case 8: case 'country': return new View_Country($essenceId);
  		case 9: case 'region': return new View_Region($essenceId);
  		case 10: case 'district': return new View_District($essenceId);
  		//case 11: case 'room': return new View_Room($essenceId);
  		case 12: case 'booking': return new View_Booking($essenceId);
    }
  }

  /**
   * Получение имени сущности по идентификатору
   *
   * @param int $essenceNumber
   * @return string
   */
  public static function getEssenceTypeNameById($essenceNumber) {
    switch ($essenceNumber) {
    	case 1: return 'administration';
  		case 2: return 'user';
  		case 3: return 'faq';
  		case 4: return 'faq_section';
  		case 5: return 'article';
  		case 6: return 'hotel';
  		case 7: return 'city';
  		case 8: return 'country';
  		case 9: return 'region';
  		case 10: return 'district';
  		case 11: return 'room';
  		case 12: return 'booking';

  		default:
  		  return false;
  		  throw new Exception('Invalid input numeric / string value type entity');
  	}
  }

  /**
   * Получение идентификатора сущности по имени
   *
   * @param string $essenceName
   * @return int
   */
  public static function getEssenceTypeIDByName($essenceName) {
    switch ($essenceName) {
      case 'administration': return 1;
  		case 'user': return 2;
  		case 'faq': return 3;
  		case 'faq_section': return 4;
  		case 'article': return 5;
  		case 'hotel': return 6;
  		case 'city': return 7;
  		case 'country': return 8;
  		case 'region': return 9;  		
  		case 'district': return 10;
  		case 'room': return 11;
  		case 'booking': return 12;
  		case 'our_hotel_photo': return 13;
  		case 'our_room_photo': return 14;

  		default:
  		  throw new Exception('Invalid input numeric / string value type entity');
  		  return false;
  	}
  }

  /**
   * Получение идентификатора сущности по любому параметру
   *
   * @param mixed $essenceType
   * @return int
   */
  public static function getEssenceTypeID($essenceType) {
    if (is_string($essenceType)) return intval(self::getEssenceTypeIDByName($essenceType));
    elseif (!is_numeric($essenceType)) throw new Exception('Invalid input numeric / string value type entity');
    if (self::isEssenceTypeIdCorrect($essenceType)) return $essenceType;
    else return false;
  }

  /**
   * Метод проверяет, корректно ли указан идентификатор типа сущности
   *
   * @param integer $essenceTypeId
   * @return boolean
   */
  public static function isEssenceTypeIDCorrect($essenceTypeId) {
    return self::getEssenceTypeNameById($essenceTypeId) ? true : false;
  }

  /**
   * Метод проверяет, корректно ли указан идентификатор типа сущности
   *
   * @param integer $essenceTypeId
   * @return boolean
   */
  public static function isEssenceTypeNameCorrect($essenceTypeName) {
    return self::getEssenceTypeIDByName($essenceTypeName) ? true : false;
  }

  /**
   * Проверяет, совпадает ли пользователь с автором
   *
   * @param integer $essenceType
   * @param integer $essenceID
   * @param integer $userId
   */
  public static function isAuthorTheSame($essenceType, $essenceId, $userId = null) {
    if (!$userId) {
      $objSession = User_Session::instance();
      $userId = $objSession->getUserId();
    }
    if (!$userId) return false;
    $strTable = Service_Essence::getEssenceTypeName($essenceType);
	  $objDB = Service_Database::instance();
		$stmt = "SELECT `ID_user` FROM `" . $strTable . "`
				WHERE `ID_" . $strTable . "`='" . $essenceId . "' AND `ID_user`='" . $userId . "'";
    return (sizeof($objDB->selectOne($stmt)) > 0) ? true : false;  //Осуществляем SQL-запрос
  }

  /**
   * получает автора материала
   *
   * @param integer $essenceType
   * @param integer $essenceID
   */
  public static function getAuthor($essenceType, $essenceId) {
    $strTable = Service_Essence::getEssenceTypeName($essenceType);
	  $objDB = Service_Database::instance();
		$stmt = "SELECT `ID_user` FROM `" . $strTable . "`
				WHERE `ID_" . $strTable . "`='" . $essenceId . "'";
    return $objDB->selectSimpleField($stmt);  //Осуществляем SQL-запрос
  }

  	/**
	 * Инкремент поля для сущности
	 *
	 * @param string $essenceName - Имя сущности
	 * @param int $essenceId - ID сущности
	 * @param string $columnName - поле для инкремента
	 * @return unknown
	 */
  public static function incrementColumnInEssecnce($essenceName, $essenceId, $columnName, $count = 1, $pkName = null) {
  	if (!$pkName) {
  		$objEssence = Service_Essence::getObjByID($essenceName, $essenceId);
  		$pkName = $objEssence->pkName;
  	}
  	if (!$pkName) $pkName = "ID_" . $essenceName;
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `" . $essenceName . "` SET `" . $essenceName . "`.`" . $columnName . "` = (`" . $essenceName . "`.`" . $columnName . "` + " . $count . ")
		WHERE `" . $essenceName . "`.`" . $pkName . "` = '" . $essenceId . "'";

		$res = $objDB->query($stmt);
		return $res;
	}

	/**
	 * Декремент поля для сущности
	 *
	 * @param string $essenceName - Имя сущности
	 * @param int $essenceId - ID сущности
	 * @param string $columnName - поле для декремента
	 * @return unknown
	 */
  public static function decrementColumnInEssecnce($essenceName, $essenceId, $columnName, $count = 1, $pkName = null) {
  	if (!$pkName) $pkName = "ID_" . $essenceName;
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `" . $essenceName . "` SET `" . $essenceName . "`.`" . $columnName . "` = (`" . $essenceName . "`.`" . $columnName . "` - " . $count . ")
		WHERE `" . $essenceName . "`.`" . $pkName . "` = '" . $essenceId . "'";
		return $objDB->query($stmt);
	}

}
?>